package com.linksfield.topup.mapper;

import com.linksfield.topup.config.dto.CalculateResultParamVo;
import com.linksfield.topup.entity.common.PartnerServicePlan;
import com.linksfield.topup.entity.common.PartnerServicePlanSpecPrice;
import com.linksfield.topup.entity.interfaces.anoverview.partner.orderviewdata.response.ResponseOrderViewData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.ArrayList;
import java.util.List;

/**
 * 概览：业务逻辑数据库操作映射接口
 *
 * @author: lm
 * @date: 2019-11-21 15:40
 */

@Mapper
public interface OverviewMapper {
    /***
     * 普通用户：订单总览：往期数据按照月份排列，折线图数据也一致
     * @param partnerCode
     * @param createDate
     * @return
     */
    List<CalculateResultParamVo> partnerOrderView(@Param("partnerCode") String partnerCode,
                                                  @Param("createDate") String createDate);

    /***
     * 普通用户：订单总览：往期数据按照月份排列，折线图数据也一致，合计数据
     * @param partnerCode
     * @param createDate
     * @return
     */
    List<CalculateResultParamVo> partnerOrderViewTotal(@Param("partnerCode") String partnerCode,
                                                       @Param("createDate") String createDate);

    /***
     *普通企业：套餐销售排行榜Top20
     * @param partnerCode
     * @param createDate
     * @return
     */
    List<CalculateResultParamVo> partnerSalesRank(@Param("partnerCode") String partnerCode,
                                                  @Param("createDate") String createDate);

    /***
     * 订单总览：年度订单数，年度订单总额；本月订单数，本月订单总额；上月订单数，上月订单总额：
     * @param partnerCode
     * @param years
     * @param cuMonths
     * @param laMonths
     * @return
     */
    List<CalculateResultParamVo> partnerOrderViewData(@Param("partnerCode") String partnerCode,
                                                      @Param("years") String years,
                                                      @Param("cuMonths") String cuMonths,
                                                      @Param("laMonths") String laMonths);

    /**
     * 固定数据：按照月订单数量，按照月订单总金额
     *
     * @param partnerCode
     * @param month
     * @return
     */
    List<CalculateResultParamVo> withMonthData(@Param("partnerCode") String partnerCode,
                                               @Param("createDate") String month);

    /**
     * 管理员顶部：本周订单数量，本周订单总金额
     *
     * @param firstDayOfWeek
     * @param endDayOfWeek
     * @return
     */
    List<CalculateResultParamVo> currentWeekData(@Param("firstDayOfWeek") String firstDayOfWeek,
                                                 @Param("endDayOfWeek") String endDayOfWeek);

    /**
     * 管理员：企业销售排行榜Top20
     *
     * @param mark
     * @param date
     * @return
     */
    List<CalculateResultParamVo> adminSalesRankByMonth(@Param("date") String date);

    /**
     * 管理员：企业销售排行榜Top20
     *
     * @param mark
     * @param date
     * @return
     */
    List<CalculateResultParamVo> adminSalesRankByYear(@Param("date") String date);

    /**
     * 管理员：根据所选年月和企业查询年度数据：年度订单总数，订单总金额
     *
     * @param partnerCode
     * @param date
     * @return
     */
    List<CalculateResultParamVo> withYearData(@Param("partnerCode") String partnerCode,
                                              @Param("createDate") String date);

    /**
     * 管理员：按照月份，企业查询：
     * 1，当前选中的年份全年的订单总数，订单总额；
     * 2，当前选中的月份按天的订单总数，订单总额；
     *
     * @param firstDay
     * @param lastDay
     * @param partnerCode
     * @return
     */
    ArrayList<CalculateResultParamVo> adminWithMonthByDay(@Param("firstDay") String firstDay,
                                                          @Param("lastDay") String lastDay,
                                                          @Param("partnerCode") String partnerCode);

    /**
     * 管理员：按照年份，企业查询：
     * 1，当前选中的年份全年的订单总数，订单总额；
     * 2，当前选中的年份按月的订单总数，订单总额；
     *
     * @param firstMonth
     * @param lastMonth
     * @param partnerCode
     * @return
     */
    ArrayList<CalculateResultParamVo> adminWithYearByMonth(@Param("firstMonth") String firstMonth,
                                                           @Param("lastMonth") String lastMonth,
                                                           @Param("partnerCode") String partnerCode);

    /**
     * 根据渠道编码查询企业下面有效的套餐列表
     *
     * @param partnerCode
     * @return
     */
    List<PartnerServicePlan> partnerServicePlanList(@Param("partnerCode") String partnerCode);

    /**
     * 根据企业渠道编码查询套餐编码（新建的套餐）
     * <p>
     * 其实就是查询出某个企业下面的套餐列表
     *
     * @param partnerCode
     * @return
     */
    String queryServicePlanCode(@Param("partnerCode") String partnerCode);

    /**
     * 根据某个渠道编码和某个套餐编码查询套餐的规格
     * <p>
     * 就是查询某个企业的某个套餐有哪几个规格
     *
     * @param partnerCode
     * @param servicePlanCode
     * @return
     */
    List<PartnerServicePlanSpecPrice> querySpecifications(@Param("partnerCode") String partnerCode,
                                                          @Param("servicePlanCode") String servicePlanCode);

    /**
     * 根据月份来查询：
     * 按照天显示的某个套餐的某个规格具体到某天的订单数量
     *
     * @param firstDay
     * @param lastDay
     * @param partnerCode
     * @param servicePlanCode
     * @param specifications
     * @return
     */
    ArrayList<CalculateResultParamVo> orderCountByDay(@Param("firstDay") String firstDay,
                                                      @Param("lastDay") String lastDay,
                                                      @Param("partnerCode") String partnerCode,
                                                      @Param("servicePlanCode") String servicePlanCode,
                                                      @Param("orderPeriod") String specifications);

    /**
     * 根据年份来查询：
     * 按照月份显示的某个套餐的某个规格具体到某个月的订单数量
     *
     * @param firstMonth
     * @param lastMonth
     * @param partnerCode
     * @param servicePlanCode
     * @param specifications
     * @return
     */
    ArrayList<CalculateResultParamVo> orderCountByMonth(@Param("firstMonth") String firstMonth,
                                                        @Param("lastMonth") String lastMonth,
                                                        @Param("partnerCode") String partnerCode,
                                                        @Param("servicePlanCode") String servicePlanCode,
                                                        @Param("orderPeriod") String specifications);

    /**
     * 根据年份来查询：
     * 按照月份显示的某个套餐的某个规格具体到某个月的订单总金额
     *
     * @param firstMonth：开始时间
     * @param lastMonth：结束时间
     * @param partnerCode：渠道编码
     * @param servicePlanCode：套餐编码
     * @param specifications：规格
     * @return
     */
    ArrayList<CalculateResultParamVo> orderMoneyByMonth(@Param("firstMonth") String firstMonth,
                                                        @Param("lastMonth") String lastMonth,
                                                        @Param("partnerCode") String partnerCode,
                                                        @Param("servicePlanCode") String servicePlanCode,
                                                        @Param("orderPeriod") String specifications);

    /***
     * 根据月份来查询：
     * 按照天显示的某个套餐的某个规格具体到某天的订单总金额
     *
     * @param firstDay
     * @param lastDay
     * @param partnerCode
     * @param servicePlanCode
     * @param specifications
     * @return
     */
    ArrayList<CalculateResultParamVo> orderMoneyByDay(@Param("firstDay") String firstDay,
                                                      @Param("lastDay") String lastDay,
                                                      @Param("partnerCode") String partnerCode,
                                                      @Param("servicePlanCode") String servicePlanCode,
                                                      @Param("orderPeriod") String specifications);
}
